package com.gitee.wsl.time

import kotlinx.datetime.LocalDate
import kotlinx.datetime.Month
import kotlinx.datetime.number


/**
 * 星座 来自：https://blog.csdn.net/u010758605/article/details/48317881
 *
 * @author looly
 * @since 4.4.3
 */
object Zodiac {
    /** 星座分隔时间日  */
    private val DAY_ARR = intArrayOf(20, 19, 21, 20, 21, 22, 23, 23, 23, 24, 23, 22)

    /** 星座  */
    private val ZODIACS = arrayOf<String>(
        "摩羯座",
        "水瓶座",
        "双鱼座",
        "白羊座",
        "金牛座",
        "双子座",
        "巨蟹座",
        "狮子座",
        "处女座",
        "天秤座",
        "天蝎座",
        "射手座",
        "摩羯座"
    )
    private val CHINESE_ZODIACS = arrayOf<String>("鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊", "猴", "鸡", "狗", "猪")

    /**
     * 通过生日计算星座
     *
     * @param date 出生日期
     * @return 星座名
     */
    fun getZodiac(date: LocalDate): String {
        return getZodiac(date.month.number, date.day)
    }

    /**
     * 通过生日计算星座
     *
     * @param calendar 出生日期
     * @return 星座名
     */
//    fun getZodiac(calendar: Calendar?): String? {
//        if (null == calendar) {
//            return null
//        }
//        return getZodiac(calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH))
//    }

    /**
     * 通过生日计算星座
     *
     * @param month 月，从0开始计数
     * @param day 天
     * @return 星座名
     * @since 4.5.0
     */
    fun getZodiac(month: Month, day: Int): String? {
        return getZodiac(month.ordinal, day)
    }

    /**
     * 通过生日计算星座
     *
     * @param month 月，从0开始计数，见[Month.getValue]
     * @param day 天
     * @return 星座名
     */
    fun getZodiac(month: Int, day: Int): String {
        require(month in Month.JANUARY.ordinal.. Month.DECEMBER.ordinal, { "Unsupported month value, must be [0,12]" })
        // 在分隔日前为前一个星座，否则为后一个星座
        return if (day < DAY_ARR[month]) ZODIACS[month] else ZODIACS[month + 1]
    }

    // ----------------------------------------------------------------------------------------------------------- 生肖
    /**
     * 通过生日计算生肖，只计算1900年后出生的人
     *
     * @param date 出生日期（年需农历）
     * @return 星座名
     */
    fun getChineseZodiac(date: LocalDate): String? {
        return getChineseZodiac(date.year)
    }

    /**
     * 通过生日计算生肖，只计算1900年后出生的人
     *
     * @param calendar 出生日期（年需农历）
     * @return 星座名
     */
//    fun getChineseZodiac(calendar: Calendar?): String? {
//        if (null == calendar) {
//            return null
//        }
//        return getChineseZodiac(calendar.get(Calendar.YEAR))
//    }

    /**
     * 计算生肖，只计算1900年后出生的人
     *
     * @param year 农历年
     * @return 生肖名
     */
    fun getChineseZodiac(year: Int): String? {
        if (year < 1900) {
            return null
        }
        return CHINESE_ZODIACS[(year - 1900) % CHINESE_ZODIACS.size]
    }
}
